import {
  uuid
} from 'vue-uuid';

export default class Utils {
  constructor() {}

  //生成uuid
  static guid() {
    return uuid.v1();
  }
  //数组求和
  static sum(arr) {
    return arr.reduce((total, num) => {
      return total + num;
    }, 0);
  }
  // 对象为空判断 为空返回true，反之false
  static nullBool(param) {
    return null === param || undefined === param;
  }
  // string判断 为空返回true，反之false
  static strBool(param) {
    return this.nullBool(param) || "" === param || param.length === 0;
  }
  static objBool(param) {
    return this.nullBool(param) || "{}" === JSON.stringify(param);
  }
  //遍历
  static arrayForEach(arr, fn) {
    try {
      for (let i = 0; i < arr.length; i++) {
        let bool = fn(arr[i], i);
        if (true === bool) {
          return;
        }
      }
    } catch (e) {
      console.log(e);
    }
  }
  // array length不为零 为空返回true，反之false
  static arrBool(param) {
    if (null === param || undefined === param || param.length === 0) return true;
    return false;
  }
  // 判断map是否为空 为空返回true，反之false
  static mapBool(param) {
    for (var t in param)
      return !1;
    return !0
  }
  // 判断json是否可用，true为不可用，false反之
  static jsonBool(param) {
    if (this.nullBool(param) ||
      this.getMapSize(param) === 0) return true;
    return false;
  }
  // 判断是否是array
  static isArray(obj) {
    return (typeof obj == 'object') && obj.constructor == Array;
  }
  // 判断是否是字符串
  static isString(str) {
    return (typeof str == 'string') && str.constructor == String;
  }
  // 判断是否是数值
  static isNumber(obj) {
    return (typeof obj == 'number') && obj.constructor == Number;
  }
  // 是否是时间对象
  static isDate(obj) {
    return (typeof obj == 'object') && obj.constructor == Date;
  }
  // 判断是否是函数
  static is(obj) {
    return (typeof obj == 'function') && obj.constructor == Function;
  }
  // 判断是否是对象
  static isObject(obj) {
    return (typeof obj == 'object') && obj.constructor == Object;
  }
  // 获取map的个数
  static getMapSize(map) {
    var index = 0;
    if (this.nullBool(map)) return index;
    for (var s in map) {
      ++index;
    }
    return index;
  }
  // ie浏览器判断,是返回true
  static isIEBrowser() {
    return !!window.ActiveXObject || "ActiveXObject" in window ? true : false;
  }
  // 将两个map合并成一个map，即两个map中有相同子元素，以覆盖此map中元素为准
  static mapMerge(coverMap, subjectMap) {
    var map = JSON.parse(JSON.stringify(coverMap));
    var map2 = JSON.parse(JSON.stringify(subjectMap));
    for (var s in map2) {
      map[s] = map2[s];
    }
    return map;
  }
  // 深拷贝
  static deepCopy(obj) {
    return JSON.parse(JSON.stringify(obj));
  }
  // 获取元素在页面中的坐标
  static getCoords(el) {
    var box = el.getBoundingClientRect(),
      doc = el.ownerDocument,
      body = doc.body,
      html = doc.documentElement,
      clientTop = html.clientTop || body.clientTop || 0,
      clientLeft = html.clientLeft || body.clientLeft || 0,
      top = box.top + (self.pageYOffset || html.scrollTop || body.scrollTop) - clientTop,
      left = box.left + (self.pageXOffset || html.scrollLeft || body.scrollLeft) - clientLeft
    return {
      'top': top,
      'left': left
    };
  }
  // 邮箱验证
  static checkEmail(str) {
    var re = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
    if (re.test(str)) {
      return true;
    } else {
      return false;
    }
  }
  // 手机验证 , 11位数字，以1开头。
  static checkMobile(str) {
    var re = /^1\d{10}$/;
    if (re.test(str)) {
      return true;
    } else {
      return false;
    }
  }
  // 验证帐号是否合法,字母、数字、下划线组成，字母开头，4-16位。
  static checAccount(str) {
    var re = /^[a-zA-z]\w{4,15}$/;
    if (re.test(str)) {
      return true;
    } else {
      return false;
    }
  }
  // 判断是否有全角 , 有返回true
  static checkFullAngle(str) {
    var str2 = str.match(/[\uff00-\uffff]/g);
    if (null === str2) {
      return false;
    } else {
      return true;
    }
  }
  // 判断是否有特殊符号和数字，有返回true
  static chackStr(str) {
    // eslint-disable-next-line no-useless-escape
    var regEn = /[-`~!@#$%^&*()_=+<>?:"{},\\\\.\/;'[\]]/im,
      regCn = /[·！#￥（——）：；“”‘、，|《。》？、【】[\]]/im;
    if (regEn.test(str) || regCn.test(str)) { // 包含返回true
      return true;
    }
    return false;
  }
  // 每天指定时间执行
  static timingTask(callback, hours, minutes, seconds) {
    var time = new Date(); // 当前时间
    var time2 = new Date(); // 下一天时间
    time2.setDate(time.getDate() + 1);
    time2.setHours(hours);
    time2.setMinutes(minutes);
    time2.setSeconds(seconds);
    var fn = function () {
      callback();
      setTimeout(fn, 24 * 60 * 60 * 1000);
    }
    setTimeout(fn, time2 - time);
  }
}